----------------------------------------------
--Lua脚本 工具类
----------------------------------------------

-- CSharpCallLuaRef 持有c#对lua方法的引用
local Module = {CSharpCallLuaRef = {}}
Tool = Module

--获取table的长度
function Module:TableLen(t)
    local leng = 0
    for k, v in pairs(t) do
        leng = leng + 1
    end
    return leng
end

--将C#的Dic转成Lua的Table
function Module:DicToTable(Dic)
    local dic = {}
    if Dic then
        local iter = Dic:GetEnumerator()
        while iter:MoveNext() do
            local k = iter.Current.Key
            local v = iter.Current.Value
            dic[k] = v
        end
    end
    return dic
end

--将C#的List转成Lua的Table
function Module:ListToTable(List)
    local list = {}
    if List then
        local index = 1
        local iter = List:GetEnumerator()
        while iter:MoveNext() do
            local v = iter.Current
            list[index] = v
            index = index + 1
        end
    else
        logError("Error,CSharpList is null")
    end
    return list
end

--清除所有C#对lua的引用[C#中调用该方法]
function Module:ClearAllCSReference()
    for k, v in pairs(self.CSharpCallLuaRef) do
        for k2, v2 in pairs(v) do
            --移除监听
            self:ClearListenerEvent(v2)
        end
    end
end

--清除监听事件
function Module:ClearListenerEvent(event)
    --执行移除所有的监听事件
    event:RemoveAllListeners()
    --[[必须执行一次 UnityEngine的机制... 大佬底层代码这么写  没办法...]]
    local is_btn = string.match(event:ToString(), "UnityEngine.UI.Button")
    local is_slider = string.match(event:ToString(), "UnityEngine.UI.Slider")

    --不同组件调用的参数不同
    if not (is_btn == nil) then
        event:Invoke()
    elseif not (is_slider == nil) then
        event:Invoke(0)
    else
        print("Other Component!")
    end
end

--清除某个UI对象的C#对lua的引用
function Module:ClearViewObjCSRef(form_path)
    local view = self.CSharpCallLuap[form_path]
    -- 执行清理操作
    for k, v in pairs(view) do
        v:RemoveAllListeners()
        v:Invoke()
    end
end

--添加C#对lua的引用对象
function Module:AddCSReference(formPath, obj)
    if self.CSharpCallLuaRef[formPath] == nil then
        -- print("首次添加:", obj)
        self.CSharpCallLuaRef[formPath] = {}
        self.CSharpCallLuaRef[formPath][1] = obj
    else
        -- print(len .. "次添加:", obj)
        local len = self:TableLen(self.CSharpCallLuaRef[formPath]) + 1
        self.CSharpCallLuaRef[formPath][len] = obj
    end
end

--打印所有C#对lua的引用对象（事件监听引用：Click之类的）
function Module:PrintCSReference()
    for k, v in pairs(self.CSharpCallLuaRef) do
        for k2, v2 in pairs(v) do
            print("C#持有的事件监听引用:", k, " No." .. k2, v2)
        end
    end
end
